package com.bt.lms.ui.page.sys.user;

import com.alibaba.fastjson.JSONObject;
import com.bt.lms.entity.Role;
import com.bt.lms.entity.page.Page;
import com.bt.lms.ui.page.sys.utils.MyButton;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Callback;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 关联角色界面
 *
 * @author 徐大永
 */
public class PageRelationRole extends VBox {
    /**
     * 多选框集(角色
     */
    private List<CheckBox> roleCBS;

    /**
     * 角色合集（所有角色（关联界面
     */
    private final List<Role> sumRoles;

    /**
     * 角色合集（新增用户列表）
     */
    private List<Role> roleUserList;

    /**
     * 列表容器
     */
    private final VBox roleTableViewVBox;

    /**
     * 构建界面
     *
     * @param rolePage     分页模型
     * @param alert             弹框
     * @param roleUserList      角色合集（新增用户列表
     * @param roleTableViewVBox 列表容器
     */
    public PageRelationRole(Page<Role> rolePage, Alert alert, List<Role> roleUserList, VBox roleTableViewVBox) {

        //维护
        this.roleUserList = roleUserList;
        this.roleTableViewVBox = roleTableViewVBox;

        //数据控制
        double bigWidth = 300;
        double width = 125;
        double tinyWidth = 50;

        //布局
        Insets insets = new Insets(10);
        this.setPadding(insets);
        this.setSpacing(15);
        this.setAlignment(Pos.CENTER);

        //内容
        TableView<Role> roleTable = new TableView<>();
        this.getChildren().add(roleTable);

        TableColumn<Role, Long> idTc = new TableColumn<>("操作");
        idTc.setSortable(false);
        idTc.setMinWidth(tinyWidth);
        TableColumn<Role, String> codeTC = new TableColumn<>("角色编码");
        codeTC.setSortable(false);
        codeTC.setMinWidth(width);
        TableColumn<Role, String> nameTC = new TableColumn<>("角色名称");
        nameTC.setSortable(false);
        nameTC.setMinWidth(width);
        TableColumn<Role, String> detailsTC = new TableColumn<>("角色说明");
        detailsTC.setSortable(false);
        detailsTC.setMinWidth(bigWidth);

        //添加进表
        roleTable.getColumns().addAll(idTc, codeTC, nameTC, detailsTC);

        //添加数据 得 所有角色合集
        sumRoles = amendData(rolePage);
        ObservableList<Role> roleVos = FXCollections.observableArrayList(sumRoles);
        roleTable.setItems(roleVos);

        customVRay(idTc);

        //映射
        idTc.setCellValueFactory(new PropertyValueFactory<>("id"));
        codeTC.setCellValueFactory(new PropertyValueFactory<>("code"));
        nameTC.setCellValueFactory(new PropertyValueFactory<>("name"));
        detailsTC.setCellValueFactory(new PropertyValueFactory<>("details"));


        HBox operateHBox = new HBox();
        operateHBoxInit(operateHBox, alert);
        this.getChildren().add(operateHBox);

    }


    /**
     * 操作盒子初始化
     *
     * @param operateHBox 操作盒子
     * @param alert       弹框
     */
    private void operateHBoxInit(HBox operateHBox, Alert alert) {

        //布局
        operateHBox.setAlignment(Pos.CENTER);
        operateHBox.setSpacing(15);

        MyButton confirmBtn = new MyButton("确认");
        operateHBox.getChildren().add(confirmBtn);
        confirmBtn.setOnAction(event -> {

            //角色集合
            List<Role> roles = new ArrayList<>();
            //处理选中的角色
            //循环所有选中的角色id，与查询出的所有角色对比，获取角色集合
            for (CheckBox roleCB : roleCBS) {
                boolean selected = roleCB.isSelected();
                if (selected) {
                    String idStr = roleCB.getId();
                    long roleId = Long.parseLong(idStr);
                    for (Role role : sumRoles) {
                        long id = role.getId();
                        if (roleId == id) {
                            roles.add(role);
                            break;
                        }
                    }
                }
            }
            //重新维护角色合集（新增用户界面
            roleUserList.clear();
            roleUserList.addAll(roles);
            //关闭窗口
            ButtonType buttonType = new ButtonType("");
            alert.getDialogPane().getButtonTypes().add(buttonType);
            alert.close();

            //重新加载界面，本次包含界面  需要用户信息，刚刚勾选的
            RoleTableView roleTableView = new RoleTableView(roleUserList);
            roleTableViewVBox.getChildren().set(0, roleTableView);

        });

        MyButton cancelBtn = new MyButton("返回");
        operateHBox.getChildren().add(cancelBtn);
        cancelBtn.setOnAction(event -> {
            ButtonType buttonType = new ButtonType("");
            alert.getDialogPane().getButtonTypes().add(buttonType);
            alert.close();
        });

    }

    /**
     * 修正数据
     *
     * @param rolePage 分页模型
     * @return 修正好的数据
     */
    private List<Role> amendData(Page<Role> rolePage) {

        //要返回的数据
        List<Role> roles = new ArrayList<>();

        List<Role> records = rolePage.getRecords();
        for (Object obj : records) {

            Role role = JSONObject.parseObject(obj.toString(), Role.class);
            roles.add(role);
        }
        return roles;
    }

    /**
     * 自定义渲染
     *
     * @param idTc id列
     */
    private void customVRay(TableColumn<Role, Long> idTc) {

        roleCBS = new ArrayList<>();

        //当前出现过的id(K-id:V-出现)
        Map<Long, Boolean> idMap = new HashMap<>();

        //id
        idTc.setCellFactory(new Callback<TableColumn<Role, Long>, TableCell<Role, Long>>() {
            @Override
            public TableCell<Role, Long> call(TableColumn<Role, Long> param) {

                return new TableCell<Role, Long>() {
                    @Override
                    protected void updateItem(Long id, boolean empty) {
                        //覆盖TableCell的样式更新
                        super.updateItem(id, empty);
                        if (id != null) {

                            //界面渲染
                            CheckBox roleCB = new CheckBox();
                            roleCB.setId(id.toString());//设置id为对应的角色的id

                            //判断是否出现过
                            Boolean aBoolean = idMap.get(id);
                            if (aBoolean == null)//没有出现过
                                idMap.put(id, true);
                            else
                                roleCBS.add(roleCB);//添加进多选框集合

                            //判断是否被选中
                            for (Role role : roleUserList) {
                                long roleId = role.getId();
                                if (roleId == id) {
                                    roleCB.setSelected(true);
                                    break;
                                }
                            }
                            setGraphic(roleCB);
                        }
                    }
                };
            }
        });
    }
}
